package com.own.business.question.business.service;

import com.own.business.question.common.em.QuestionType;
import com.own.business.question.entity.bo.QuestionBo;
import com.own.business.question.entity.map.QuestionMapVo;
import com.own.business.question.entity.po.Question;
import com.own.business.question.entity.query.QuestionQuery;
import com.own.business.question.entity.vo.QuestionVo;
import com.own.component.common.base.service.BaseService;
import com.own.component.common.model.UpdateModel;

import java.math.BigDecimal;
import java.util.List;

/**
 * QuestionService
 *
 * @author chenxueli
 * @date 2021/05/14 09:41:05
 */
public interface QuestionService extends BaseService<
        Question,
        QuestionBo,
        QuestionVo,
        QuestionMapVo,
        QuestionQuery
        > {

    /**
     * 根据id获取题目信息（不需要答案，并打乱顺序）
     *
     * @param questionId 题目id
     * @return 题目信息
     */
    QuestionVo getByIdForAnswer(Long questionId);

    /**
     * 根据id列表获取题目列表
     *
     * @param questionIdList 题目id列表
     * @param answer         是否需要答案
     * @param shuffle        是否需要打乱
     * @return 题目列表
     */
    default List<QuestionVo> listByIds(List<Long> questionIdList, boolean answer, boolean shuffle) {
        return listByIds(questionIdList, answer, shuffle, QuestionType.All, -1);
    }

    /**
     * 根据id列表获取题目列表
     *
     * @param questionIdList 题目id列表
     * @param answer         是否需要答案
     * @param shuffle        是否需要打乱
     * @param type           题目类型
     * @param number         题目数量
     * @return 题目列表
     */
    List<QuestionVo> listByIds(List<Long> questionIdList, boolean answer, boolean shuffle, QuestionType type, int number);

    /**
     * 修改题目的可用状态
     *
     * @param pk 题目id
     * @return 修改标识
     */
    UpdateModel<Boolean> updateDisabled(Long pk);

    /**
     * 题目答案比对
     *
     * @param pk     题目id
     * @param answer 答案信息
     * @return 比对结果（0-1）
     */
    BigDecimal matchAnswer(Long pk, String answer);

    /**
     * 添加总数
     *
     * @param pk 题目id
     */
    void addTotal(Long pk);

    /**
     * 添加总数
     *
     * @param pkList 题目id列表
     */
    void addTotal(List<Long> pkList);

    /**
     * 根据流水id获取题目信息
     *
     * @param historyId 流水id
     * @return 题目信息
     */
    QuestionVo getByHistoryId(Long historyId);

}
